package com.atguigu.juc.locks;

import org.junit.jupiter.api.Test;

import java.util.concurrent.TimeUnit;

/**
 * @author yanglin
 * @create 2024-01-08 17:36 星期一
 * description:
 */
public class DeathLockDemo {

    /**
     * 死锁：指两个或两个以上的线程在执行过程中，因争夺资源而造成的一种互相等待的情况，若无外力干涉，那么他们将无法推进下去，
     *      如果系统资源充足，进程的资源请求都能够得到满足，死锁出现的可能性就很低，否则就会因为争夺有限的资源而陷入死锁
     *      
     * 死锁产生的原因：
     *      系统资源不足
     *      进程运行推进的顺序不合适
     *      资源分配不当
     * 
     * 如何排查死锁：方法一：
     *              jps -l （查看进程号）
     *              jstack 进程号   （查看死锁的详细信息）
     *             方法二：
     *              jconsole 
     */

    
    /**
     * 一个死锁案例
     * @param args
     */
    public static void main(String[] args) {
        final Object objectA = new Object();
        final Object objectB = new Object();
        new Thread(() -> {
            synchronized (objectA){
                System.out.println("t1 外层代码获取到锁A");
                try {
                    TimeUnit.MILLISECONDS.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (objectB){
                    System.out.println("t1 内层代码回去到锁B");
                }
            }
        },"t1").start();

        new Thread(() -> {
            synchronized (objectB){
                System.out.println("t2 外层代码获取到了锁B");
                synchronized (objectA){
                    System.out.println("t2 内层代码获取到了锁A");
                }
            }
        },"t2").start();
    }
}
